package csdn.chouxiang.li05;
//外部类
public class Outer {
    private int outer_num=10;
    private int num=20;
    //定义成员内部类
    public class Inner {
    private int inner_num=30;
    private int num=40;
        //成员内部类不能定义static
        // private static int a;
        // public static void fly(){}

    //内部类中可以直接访问外部成员属性和方法。
        void show(){
            num =50;
            //内部类的方法中，内部类中和外部类中有同名属性，默认是就近原则。
            System.out.println("在内部类中访问outer_num:"+outer_num);
            System.out.println("在内部类中访问num:"+num);//就近原则，先50---40---20
            System.out.println("在内部类中访问num:"+this.num);//访问内部类40
            System.out.println("在内部类中访问num:"+Outer.this.num);//访问外部类20
        }
    }
    //在外部类中可以直接访问内部类中所以的成员和方法，但是要借助内部类的对象。
    public void disp1(){
        //实例化内部对象
        Inner inner=new Inner();//完整版:Outer.Inner inner=this.new Inner();
        System.out.println("在外部类访问内部类inner_num:"+inner.inner_num);
        System.out.println("在外部类中访问内部show():");
        inner.show();
    }
    //----------------------------------------------------------------------------------------------

    private static int outstatic_num=1;
    //静态内部类
    static class StaticInner{
        //内部属性类
        private int staticInner=100;
        //静态内部类中可以定义静态类的属性和方法
        private static int static_num=200;

        //静态内部类只能访问外部类的静态属性和方法
        public static void staticFun(){
            System.out.println("静态内部类访问外部类的静态属性："+outstatic_num);
        }

    }
//外部类中可以访问静态内部类的所有属性和方法。
    public void disp2(){
        StaticInner inner =new StaticInner();
        System.out.println("访问静态内部类的静态方法：");
        inner.staticFun();
    }
//-------------------------------------------------------------------------------------------------------

//局部内部类：局部内部类定义在方法中，作用范围只在当前方法
//默认添加final,常量值不能修改
//不常用，但需要了解
//!!从局部内部类引用的变量必须是最终变量。
public void disp3(){
    int num3=3;//相当于：final int num3=3； 
    //局部内部类
        class JbInner{
            int jb_num3=20;
            public void jb_show(){
                System.out.println("局部内部类调用外部方法的属性:"+num3);
                System.out.println("局部内部类调用自己的属性:"+this.jb_num3);
                // num3=4;
                // System.out.println(num3);-----不能修改，false
            }
        }

    //创建局部内部类对象
    JbInner inner=new JbInner();
        inner.jb_show();
        System.out.println(inner.jb_num3);

}

//------------------------------------------------------------------------------------------

    //匿名内部类演示在Test.class



}
